

function findStr(string, pattern) {
  let start
  let allStates = []
  let next = [0, 0]
  //  k: v
  function findX(map, reconsume, next) {
    return function findNext(char) {
      let v = map.get(char)
      if (map.has(char)) {
        return allStates[v]
      }
      if (reconsume) {

        // return start(char)
        return allStates[next](char)

      } else {
        return start
      }
    }
  }
  {
    let state = end
    let j = 0
    for (let i = 1; i < pattern.length; i++) {

      if (pattern[i] === pattern[j]) {
        next[++i] = ++j
      } else if (pattern[i] !== pattern[j] && j === 0) {
        next[i + 1] = 0
      } else {
        i--
        j = next[j]
      }
    }
    // for (let i = 1; j = 0; i < pattern.length; i++ ) {
    // }
    for (let j = 0; j < pattern.length; j++) {
      let map = new Map()
      map.set(pattern[j], j + 1)
      state = findX(map, j !== pattern.length - 1, next[j])
      allStates.push(state)
    }
    allStates.push(end)
    start = state
  }
  let state = start
  for (let i = 0; i < string.length; i++) {
    state = state(string[i])
    if (state === end) {
      console.log('进来')
      // return i
      return i - pattern.length + 1
    }
  }
  return -1
}








// function start(c) {
//   if (c === 'a') {
//     return findA
//   } else {
//     return start
//   }
// }
// function findA(c) {
//   if (c === 'b') {
//     return findB
//   } else {
//     return start
//   }
// }

// function findB(c) {
//   if (c === 'a') {
//     return findA2
//   } else {
//     return start
//   }
// }

// function findA2(c) {
//   if (c === 'b') {
//     return findB2
//   } else {
//     start
//   }
// }

// function findB2(c) {
//   if (c === 'c') {
//     return end
//   } else {
//     return start
//   }
// }

// function findS(c) {
//   if (c === 'a') {
//     return findA
//   } else {
//     return start
//   }
// }

// function findA(c) {
//   console.log({ c })
//   if (c === 'd') {
//     return end
//   } else {
//     return start
//   }
// }

function end(c) {
  return end
  // return end
}

//haystack = "sadbutsad", needle = "sad"
//
// console.log(findStr("butsad", "sad"))
// console.log(findStr("kkababcbutsad", "ababc"))
console.log(findStr("ababcdef", "abcde"))
